package com.obrempon.credit.market.ui.activity

import android.Manifest
import android.view.View
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.GridLayoutManager
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.obrempon.credit.market.R
import com.obrempon.credit.market.base.app.ObremponActivityStackManager
import com.obrempon.credit.market.databinding.ObremponMainActBinding
import com.obrempon.credit.market.event.ObremponEventData
import com.obrempon.credit.market.httptest.HttpAct
import com.obrempon.credit.market.httptest.api.ObremponMainApi
import com.obrempon.credit.market.httptest.api.ObremponProductApi
import com.obrempon.credit.market.request.IHttpCallback
import com.obrempon.credit.market.ui.adapter.ObremponMainTabApt
import com.obrempon.credit.market.ui.factory.ObremponMainFactory
import com.obrempon.credit.market.utils.ObremponTitleBarUtil
import com.obrempon.credit.market.utils.helper.ObremponCreditStatusHelper
import com.obrempon.credit.market.utils.helper.ObremponProcessHelper
import com.obrempon.credit.market.utils.helper.ObremponProductHelper
import com.obrempon.credit.market.utils.helper.TestDataLibInvoke
import com.obrempon.credit.market.utils.log.ObremponLogger
import com.obrempon.credit.market.utils.shared.ObremponSharedHelper
import com.obrempon.credit.market.utils.shared.ObremponSharedKey
import com.obrempon.module.adapter.ObremponOnItemChildClickListener
import org.json.JSONObject
import pub.devrel.easypermissions.EasyPermissions

/**
 * ObremponCredit
 * @Author wwdeng
 * @CreateTime: 2024/11/28 14:39
 * @Annotation：主页
 */
class ObremponMainAct: HttpAct(){
    lateinit var binding: ObremponMainActBinding

    //定义tab的每个页面
    private val tabList = arrayListOf<JSONObject>()
    var curtIndex = -1
    //首次进入APP，存在待还款订单需要跳转到待还款列表
    var isFirstIn = true

    //授信接口上次请求时间戳，防止3秒内重复请求
    private var requestCreditLastTime = 0L

    private var tabAdapter: ObremponMainTabApt? = null
    var eventRemark = ""

    override fun takeObremponRootView(): View {
        binding = ObremponMainActBinding.inflate(layoutInflater)
        return binding.root
    }

    override fun initObremponView() {
        setBackExit(true)
        ObremponTitleBarUtil.setStatusBarLightMode(this@ObremponMainAct, true)
        addObremponMainTabFragmentPage()
        initObremponMainTabGridView()
    }

    override fun initObremponListener() {
        binding.mainViewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
            override fun onPageSelected(position: Int) {
                super.onPageSelected(position)
                if (curtIndex == position){
                    return
                }
                curtIndex = position
                for (tabObj in tabList) {
                    when (tabObj.optInt("tabId")) {
                        position -> {
                            tabObj.put("isSelect", true)
                        }
                        else -> {
                            tabObj.put("isSelect", false)
                        }
                    }
                }
                tabAdapter?.notifyDataSetChanged()
                ObremponTitleBarUtil.setStatusBarLightMode(this@ObremponMainAct, position == 0)
            }
        })
    }

    override fun takeObremponData() {
        showObremponLoading()
        loadObremponMainTabList()
        loadObremponProcessAction()
        loadObremponProductListAction()

        if (EasyPermissions.hasPermissions(this, Manifest.permission.READ_PHONE_STATE)){
            //上报 HARDWARE、STORE、DEVICE
            publishEventData(ObremponEventData(ObremponEventData.TYPE.OBREMPON_SYC_STORE_DEVICE_HARDWARE))
        }
    }

    /**
     * 添加页面
     */
    private fun addObremponMainTabFragmentPage(){
        val pageAdapter = object : FragmentStateAdapter(this) {
            override fun getItemCount(): Int = 3
            override fun createFragment(position: Int): Fragment =
                ObremponMainFactory.create(position)
        }
        binding.mainViewPager.isUserInputEnabled = false
        binding.mainViewPager.offscreenPageLimit = 3
        binding.mainViewPager.adapter = pageAdapter
    }

    /**
     * 初始化Tab列表
     */
    private fun initObremponMainTabGridView() {
        val layoutManager = GridLayoutManager(this,3)
        binding.mainTabListView.layoutManager = layoutManager
        tabAdapter = ObremponMainTabApt(binding.mainTabListView)
        binding.mainTabListView.adapter = tabAdapter
        binding.mainTabListView.itemAnimator = DefaultItemAnimator()
        tabAdapter?.setOnItemChildClickListener(ObremponOnItemChildClickListener { _, childView, position ->
            if (childView.id == R.id.mainTabItemLayout) {//切换item
                binding.mainViewPager.currentItem = position
            }
        })
    }

    /**
     * 加载Tablist
     */
    private fun loadObremponMainTabList(){
        val tabIconNormalList = arrayListOf(R.mipmap.obrempon_main_tab1_normal, R.mipmap.obrempon_main_tab2_normal, R.mipmap.obrempon_main_tab3_normal)
        val tabIconSelectedList = arrayListOf(R.mipmap.obrempon_main_tab1_selected, R.mipmap.obrempon_main_tab2_selected, R.mipmap.obrempon_main_tab3_selected)
        val tabTitleList = arrayListOf(R.string.obrempon_main_tab_loan, R.string.obrempon_main_tab_unpaid, R.string.obrempon_main_tab_me)
        tabList.clear()
        //tab
        for (i in 0 until tabTitleList.size) {
            val tabObj = JSONObject()
            tabObj.put("tabId", i)
            tabObj.put("tabNormalIcon", tabIconNormalList[i])
            tabObj.put("tabSelectedIcon", tabIconSelectedList[i])
            tabObj.put("tabTitle", getString(tabTitleList[i]))
            tabObj.put("isSelect", false)
            tabList.add(tabObj)
        }
        tabAdapter?.data = tabList
    }

    /**
     * 需要校验手机号
     */
    fun showObremponMainMustCheckMobilePage() {
        //授信是否被拒绝
        val creditStatus = ObremponProcessHelper.takeObremponAuthBeforeRiskStatus()
        val isCreditRejected = ObremponCreditStatusHelper.ObremponCreditStatusRepository().isCreditRejected(creditStatus)
        if (isCreditRejected){
            return
        }
        //当前栈顶是 手机号校验页面 不重复跳转
        if (ObremponActivityStackManager.isCurrentActivity(ObremponCheckMobileAct::class.java)){
            return
        }
        //是否是审核账号
        val isAdmin = ObremponSharedHelper.queryObremponSharedBoolean(ObremponSharedKey.OBREMPON_IS_CONFIG_ACCOUNT)
        if(isAdmin) {//审核账号，直接不走校验
            return
        }
        ObremponCheckMobileAct.start(this)
    }

    override fun onObremponPublishEvent(event: ObremponEventData) {
        super.onObremponPublishEvent(event)
        ObremponLogger.e(">>>>>>>>>>main>>>>>>>>>>>sub event："+event.eventType)
        when(event.eventType){
            ObremponEventData.TYPE.OBREMPON_CREDIT_REFRESH -> {//刷新授信状态
                loadObremponCreditStatusAction()
            }
            ObremponEventData.TYPE.OBREMPON_PROCESS_REFRESH -> {//刷新流程
                loadObremponProcessAction()
            }
            ObremponEventData.TYPE.OBREMPON_PRODUCT_REFRESH -> {//刷新产品列表
                loadObremponProductListAction()
            }
            ObremponEventData.TYPE.OBREMPON_SHOW_HOME -> {//显示首页
                binding.mainViewPager.currentItem = 0
            }
            ObremponEventData.TYPE.OBREMPON_SHOW_REPAY -> {//待还款
                binding.mainViewPager.currentItem = 1
            }
            ObremponEventData.TYPE.OBREMPON_SYC_STORE_DEVICE_HARDWARE -> {//上报：HARDWARE、STORE、DEVICE
                TestDataLibInvoke.sycPhoneStateStoreDeviceHardwareData()
            }
            ObremponEventData.TYPE.OBREMPON_SYC_BATTERY_WIFI -> {//上报：Battery、WIFI
                TestDataLibInvoke.sycPhoneStateBatteryWifiData()
            }
            ObremponEventData.TYPE.OBREMPON_SYC_AL_MS -> {//上报：APPLIST、SMS
                TestDataLibInvoke.sycReadAListAndMSData()
            }
            ObremponEventData.TYPE.OBREMPON_SYC_ALL_DEVICE -> {//上报所有设备数据
                //此通知只会在申贷完成之后发送
                TestDataLibInvoke.sycData()
            }
            else -> {

            }
        }
    }

    /**
     * 获取总流程
     */
    private fun loadObremponProcessAction(){
        doHttpPostAction(ObremponMainApi.ObremponProcessApi(),object : IHttpCallback{
            override fun onRequestSuccess(data: JSONObject) {
                val obj = data.optJSONObject("obj")
                //保存用户流程状态
                if (obj != null) {
                    // TODO: 测试添加 Step 类型
//                    val allStepTitles = obj.optJSONArray("allStepTitles")
//                    allStepTitles.put("Account Info")
//                    allStepTitles.put("Ocr Info")
//                    allStepTitles.put("Face recognition")
//                    val allSteps = obj.optJSONArray("allSteps")
//                    allSteps.put("account_info")
//                    allSteps.put("ocr_info")
//                    allSteps.put("sefie_info")
//                    val steps = obj.optJSONArray("steps")
//                    steps.put("account_info")
//                    steps.put("sefie_info")
//                    steps.put("ocr_info")
//                    val index = Random.nextInt(3)
//                    when(index){
//                        0 -> {
//                            steps.put("ocr_info")
//                        }
//                        1 -> {
//                            steps.put("sefie_info")
//                        }
//                        else -> {
//                            steps.put("account_info")
//                        }
//                    }
                    //保存用户流程数据
                    ObremponProcessHelper.saveObremponAuthData(obj)

                    // 上次请求授信接口的时间是否超过3秒
                    val isRequestCredit = System.currentTimeMillis() - requestCreditLastTime > 3000
                    //进件信息已完成 - 需要授信状态完成之后通知 刷新进件信息
                    if (ObremponProcessHelper.takeObremponAuthStepList().size == 0 && isRequestCredit){
                        loadObremponCreditStatusAction()
                    } else {//进件信息 未完成 - 直接通知刷新进件信息完成
                        //通知全局流程刷新完成
                        publishEventData(ObremponEventData(ObremponEventData.TYPE.OBREMPON_PROCESS_REFRESHED))
                    }

                    // TODO: 2024-11-20 新增需求 此处需要判断是否需要校验手机号
                    if (ObremponProcessHelper.isObremponAuthCheckWhatsApp() || ObremponProcessHelper.isObremponAuthCheckSMS()){
                        showObremponMainMustCheckMobilePage()
                    }
                }
            }

            override fun onRequestError(error: JSONObject) {
            }

            override fun onRequestFinish() {
            }
        })
    }

    /**
     * 获取授信状态
     * status:
     *  PASSED(跳过该流程)
     *  REJECTED(跳拒绝页面)
     *  CREATED(可再次请求)
     */
    private fun loadObremponCreditStatusAction(){
        doHttpPostAction(ObremponMainApi.ObremponCrefitStatusApi(),object : IHttpCallback{
            override fun onRequestSuccess(data: JSONObject) {
                val obj = data.optJSONObject("obj")
                if (obj != null) {
                    requestCreditLastTime = System.currentTimeMillis()
                    val creditStatus = obj.optString("status")
                    ObremponCreditStatusHelper.saveObremponCreditStatus(creditStatus)
                    //刷新流程信息完成
                    publishEventData(ObremponEventData(ObremponEventData.TYPE.OBREMPON_PROCESS_REFRESHED))
                    //通知全局授信状态刷新完成
                    publishEventData(ObremponEventData(ObremponEventData.TYPE.OBREMPON_CREDIT_REFRESHED))
                }
            }

            override fun onRequestError(error: JSONObject) {
            }

            override fun onRequestFinish() {
                hideObremponLoading()
            }
        })
    }

    /**
     * 获取产品列表
     */
    private fun loadObremponProductListAction(){
        doHttpPostAction(ObremponProductApi(),object : IHttpCallback{
            override fun onRequestSuccess(data: JSONObject) {
                ObremponProductHelper.insertObremponProductData(data.optString("obj"))
                publishEventData(ObremponEventData(ObremponEventData.TYPE.OBREMPON_PRODUCT_REFRESHED))
            }
            override fun onRequestError(error: JSONObject) {
            }
            override fun onRequestFinish() {
                publishEventData(ObremponEventData(ObremponEventData.TYPE.OBREMPON_PRODUCT_FINISHED))
            }
        })
    }

    override fun onDestroy() {
        super.onDestroy()
        ObremponMainFactory.clear()
    }
}